package cn.cl.gulimall.product.service.impl;

import cn.cl.common.to.SkuReductionTo;
import cn.cl.common.to.SpuBoundTo;
import cn.cl.common.utils.R;
import cn.cl.gulimall.product.entity.*;
import cn.cl.gulimall.product.feign.CouponFeignService;
import cn.cl.gulimall.product.service.*;
import cn.cl.gulimall.product.vo.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.cl.common.utils.PageUtils;
import cn.cl.common.utils.Query;

import cn.cl.gulimall.product.dao.SpuInfoDao;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;


@Service("spuInfoService")
public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService {

	@Override
	public PageUtils queryPage(Map<String, Object> params) {
		IPage<SpuInfoEntity> page = this.page(
				new Query<SpuInfoEntity>().getPage(params),
				new QueryWrapper<SpuInfoEntity>()
		);
		return new PageUtils(page);
	}

	@Autowired
	private SpuInfoDescService spuInfoDescService;
	@Autowired
	private SpuImagesService spuImagesService;
	@Autowired
	private AttrService attrService;
	@Autowired
	private ProductAttrValueServiceImpl productAttrValueService;
	@Autowired
	private SkuInfoService skuInfoService;
	@Autowired
	private SkuImagesService skuImagesService;
	@Autowired
	private SkuSaleAttrValueService skuSaleAttrValueService;
	@Autowired
	private CouponFeignService couponFeignService;

	/**
	 * 保存Spu
	 */
	@Transactional
	@Override
	public void saveSpuInfo(SpuSaveVo spuSaveVo) {
		// 1、保存spu基本信息 pms_spu_info
		SpuInfoEntity spuInfoEntity = new SpuInfoEntity();
		BeanUtils.copyProperties(spuSaveVo, spuInfoEntity);
		spuInfoEntity.setCreateTime(new Date());
		spuInfoEntity.setUpdateTime(new Date());
		this.saveBaseSpuInfo(spuInfoEntity);
		// 2、保存spu的描述图片 pms_spu_info_desc
		List<String> decript = spuSaveVo.getDecript();
		if (decript != null || decript.size() > 0) {
			SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();
			spuInfoDescEntity.setSpuId(spuInfoEntity.getId());
			spuInfoDescEntity.setDecript(String.join(",", decript));
			spuInfoDescService.saveSpuInfoDesc(spuInfoDescEntity);
		}
		// 3、保存spu的图片集 pms_spu_images
		List<String> images = spuSaveVo.getImages();
		if (images != null || images.size() > 0) {
			spuImagesService.saveImages(spuInfoEntity.getId(), images);
		}
		// 4、保存spu的规格参数 pms_product_attr_value
		List<BaseAttrs> baseAttrs = spuSaveVo.getBaseAttrs();
		if (baseAttrs != null || baseAttrs.size() > 0) {
			List<ProductAttrValueEntity> productAttrValueEntities = baseAttrs.stream().map((attr) -> {
				ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
				productAttrValueEntity.setSpuId(spuInfoEntity.getId());
				productAttrValueEntity.setAttrId(attr.getAttrId());
				AttrEntity attrEntity = attrService.getById(attr.getAttrId());
				productAttrValueEntity.setAttrName(attrEntity.getAttrName());
				productAttrValueEntity.setAttrValue(attr.getAttrValues());
				productAttrValueEntity.setQuickShow(attr.getShowDesc());
				return productAttrValueEntity;
			}).collect(Collectors.toList());
			productAttrValueService.saveProductAttr(productAttrValueEntities);
		}
		// 5、保存spu的积分信息：gulimall_sms->sms_spu_bounds
		Bounds bounds = spuSaveVo.getBounds();
		SpuBoundTo spuBoundTo = new SpuBoundTo();
		BeanUtils.copyProperties(bounds, spuBoundTo);
		spuBoundTo.setSpuId(spuInfoEntity.getId());
		R r = couponFeignService.saveSpuBounds(spuBoundTo);
		if (r.getCode() != 0) {
			log.error("远程保存spu积分信息失败！");
		}
		// 6、保存当前spu对应的所有sku信息
		// 6.1、sku的基本信息：pms_sku_info
		List<Skus> skus = spuSaveVo.getSkus();
		if (skus != null || skus.size() > 0) {
			skus.forEach((sku) -> {
				String defaultImg = "";
				for (Images image : sku.getImages()) {
					if (image.getDefaultImg() == 1) {
						defaultImg = image.getImgUrl();
					}
				}
				SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
				BeanUtils.copyProperties(sku, skuInfoEntity);
				skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());
				skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId());
				skuInfoEntity.setSaleCount(0L);
				skuInfoEntity.setSpuId(spuInfoEntity.getId());
				skuInfoEntity.setSkuDefaultImg(defaultImg);
				skuInfoService.saveSkuInfo(skuInfoEntity);
				Long skuId = skuInfoEntity.getSkuId();
				// 6.2、sku的图片信息：pms_sku_images
				List<SkuImagesEntity> skuImagesEntities = sku.getImages().stream().map((img) -> {
					SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
					skuImagesEntity.setSkuId(skuId);
					skuImagesEntity.setImgUrl(img.getImgUrl());
					skuImagesEntity.setDefaultImg(img.getDefaultImg());
					return skuImagesEntity;
				}).filter((entity) -> {
					// 返回true就是需要
					return !StringUtils.isEmpty(entity.getImgUrl());
				}).collect(Collectors.toList());
				skuImagesService.saveBatch(skuImagesEntities);
				// TODO 没有图片：路径无需保存
				// 6.3、sku的销售属性信息：pms_sku_sale_attr_value
				List<Attr> attrs = sku.getAttr();
				if (attrs != null || attrs.size() > 0) {
					List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attrs.stream().map((attr) -> {
						SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity();
						BeanUtils.copyProperties(attr, skuSaleAttrValueEntity);
						skuSaleAttrValueEntity.setSkuId(skuId);
						return skuSaleAttrValueEntity;
					}).collect(Collectors.toList());
					skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);
				}
				// 6.4、sku的优惠、满减等信息；gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
				SkuReductionTo skuReductionTo = new SkuReductionTo();
				BeanUtils.copyProperties(sku, skuReductionTo);
				skuReductionTo.setSkuId(skuId);
				if (skuReductionTo.getFullCount() > 0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal(0)) == 1) {
					R r1 = couponFeignService.saveSkuReduction(skuReductionTo);
					if (r1.getCode() != 0) {
						log.error("远程保存spu优惠信息失败！");
					}
				}
			});
		}
	}

	/**
	 * 1、保存spu基本信息 pms_spu_info
	 */
	@Override
	public void saveBaseSpuInfo(SpuInfoEntity spuInfoEntity) {
		this.baseMapper.insert(spuInfoEntity);
	}

	/**
	 * 查询Spu
	 */
	@Override
	public PageUtils queryPageByCondition(Map<String, Object> params) {
		QueryWrapper<SpuInfoEntity> queryWrapper = new QueryWrapper<>();
		String key = (String) params.get("key");
		if (!StringUtils.isEmpty(key)) {
			queryWrapper.and((w) -> {
				w.eq("id", key)
						.or()
						.like("spu_name", key);
			});
		}
		String status = (String) params.get("status");
		if (!StringUtils.isEmpty(status)) {
			queryWrapper.eq("publish_status", status);
		}
		String brandId = (String) params.get("brandId");
		if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) {
			queryWrapper.eq("brand_id", brandId);
		}
		String catelogId = (String) params.get("catelogId");
		if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) {
			queryWrapper.eq("catalog_id", catelogId);
		}
		IPage<SpuInfoEntity> page = this.page(
				new Query<SpuInfoEntity>().getPage(params),
				queryWrapper
		);
		return new PageUtils(page);
	}
}